/**
 * FileName: PageInfoUtils
 * Author:   秋水浮萍
 * Date:     2020/9/17 17:14
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.demo.utils;

import com.github.pagehelper.PageInfo;

/**
 * 〈一句话功能简述〉<br> 
 * 〈〉
 *手动分页需要手动设置PageInfo的各个参数，指定分页规则。下面就是一个将list列表手动分页成PageInfo的工具类：
 * @author 秋水浮萍
 * @create 2020/9/17
 * @since 1.0.0
 */
public class PageInfoUtils {
//    public static <T> PageInfo<T> list2PageInfo(List<T> arrayList, Integer pageNum, Integer pageSize) {
//        //实现list分页
//        PageHelper.startPage(pageNum, pageSize);
//        int pageStart =  (pageNum - 1) * pageSize;
//        int pageEnd = arrayList.size() < pageSize * pageNum ? arrayList.size() : pageSize * pageNum;
//        List<T> pageResult = new LinkedList<T>();
//        if (arrayList.size() > pageStart) {
//            pageResult = arrayList.subList(pageStart, pageEnd);
//        }
//        PageInfo<T> pageInfo = new PageInfo<T>(pageResult);
//        //获取PageInfo其他参数
//        pageInfo.setTotal(arrayList.size());
//        int endRow = pageInfo.getEndRow() == 0 ? 0 : (pageNum - 1) * pageSize + pageInfo.getEndRow() + 1;
//        pageInfo.setEndRow(endRow);
//        boolean hasNextPage = arrayList.size() <= pageSize * pageNum ? false : true;
//        pageInfo.setHasNextPage(hasNextPage);
//        boolean hasPreviousPage = pageNum == 1 ? false : true;
//        pageInfo.setHasPreviousPage(hasPreviousPage);
//        pageInfo.setIsFirstPage(!hasPreviousPage);
//        boolean isLastPage = (arrayList.size() > pageSize * (pageNum - 1) && arrayList.size() <= pageSize * pageNum) ? true : false;
//        pageInfo.setIsLastPage(isLastPage);
//        int pages = arrayList.size() % pageSize == 0 ? arrayList.size() / pageSize : (arrayList.size() / pageSize) + 1;
//        pageInfo.setNavigateLastPage(pages);
//        int[] navigatePageNums = new int[pages];
//        for (int i = 1; i < pages; i++) {
//            navigatePageNums[i - 1] = i;
//        }
//        pageInfo.setNavigatepageNums(navigatePageNums);
//        int nextPage = pageNum < pages ? pageNum + 1 : 0;
//        pageInfo.setNextPage(nextPage);
//        pageInfo.setPageNum(pageNum);
//        pageInfo.setPageSize(pageSize);
//        pageInfo.setPages(pages);
//        pageInfo.setPrePage(pageNum - 1);
//        pageInfo.setSize(pageInfo.getList().size());
//        int starRow = arrayList.size() < pageSize * pageNum ? 1 + pageSize * (pageNum - 1) : 0;
//        pageInfo.setStartRow(starRow);
//        return pageInfo;
//    }

    /**
     * PageHelper中，如果当前页是最后一页，则返回的nextPage是0，即首页，而有时我们需要最后一页的nextPage是lastPage，因此写此方法
     * @param currentPage
     * @param pageObj
     * @return
     */
    public static <T> PageInfo<T> lastPageSetNextPage(int currentPage, PageInfo<T> pageObj) {
        if (currentPage == pageObj.getPages()) {
            pageObj.setNextPage(pageObj.getPages());
        }
        return pageObj;
    }

    public static <T> PageInfo<T> initPageInfoObj(int currentPage, int total, int pageSize, PageInfo<T> pageInfo) {
        pageInfo.setNextPage(currentPage < ((total + pageSize - 1) / pageSize) ? currentPage + 1 : currentPage);
        pageInfo.setTotal(total);
        pageInfo.setPageNum(currentPage);
        pageInfo.setPages((total + pageSize - 1) / pageSize);
        pageInfo.setNavigateLastPage((total + pageSize - 1) / pageSize);
        pageInfo.setPrePage(currentPage > 1 ? currentPage - 1 : currentPage);
        pageInfo.setIsFirstPage(currentPage == 1 ? true : false);
        pageInfo.setIsLastPage(currentPage == (total + pageSize - 1) / pageSize ? true : false);
        pageInfo.setHasPreviousPage(currentPage == 1 ? false : true);
        pageInfo.setHasNextPage(currentPage == (total + pageSize - 1) / pageSize ? false : true);
        return calcNavigatepageNums(pageInfo);
    }

    private static <T> PageInfo<T> calcNavigatepageNums(PageInfo<T> pageInfo) {
        //当总页数小于或等于导航页码数时
        if (pageInfo.getPages() <= pageInfo.getNavigatePages()) {
            pageInfo.setNavigatepageNums(new int[pageInfo.getPages()]);
            for (int i = 0; i < pageInfo.getPages(); i++) {
                pageInfo.getNavigatepageNums()[i] = i + 1;
            }
        } else { //当总页数大于导航页码数时
            pageInfo.setNavigatepageNums(new int[pageInfo.getNavigatePages()]);
            int startNum = pageInfo.getPageNum() - pageInfo.getNavigatePages() / 2;
            int endNum = pageInfo.getPageNum() + pageInfo.getNavigatePages() / 2;

            if (startNum < 1) {
                startNum = 1;
                //(最前navigatePages页
                for (int i = 0; i < pageInfo.getNavigatePages(); i++) {
                    pageInfo.getNavigatepageNums()[i] = startNum++;
                }
            } else if (endNum > pageInfo.getPages()) {
                endNum = pageInfo.getPages();
                //最后navigatePages页
                for (int i = pageInfo.getNavigatePages() - 1; i >= 0; i--) {
                    pageInfo.getNavigatepageNums()[i] = endNum--;
                }
            } else {
                //所有中间页
                for (int i = 0; i < pageInfo.getNavigatePages(); i++) {
                    pageInfo.getNavigatepageNums()[i] = startNum++;
                }
            }
        }
        return pageInfo;
    }


}